/*
  grunt的入口文件 gruntfile.js
  用于定义一些需要grunt自动执行的任务
  需要导出一个函数
  此函数接受一个grunt的对象类型的形参
  grunt对象中提供一些创建任务时会用到的API
*/

const sass = require('sass');
const loadGruntTasks = require('load-grunt-tasks');

module.exports = (grunt) => {
  // // console.log(grunt);
  // // grunt.initConfig用于为任务添加一些配置选项
  // grunt.initConfig({
  //   // 键一般对应任务的名称，值可以是任意类型的数据
  //   foo: {
  //     bar: 'baz'
  //   }
  // });

  // grunt.registerTask('foo', () => {
  //   // 任务中可以使用grunt.config()来获取配置
  //   console.log(grunt.config('foo')) // 此处的foo对应的是initConfig中的foo任务名称
  //   // 如果属性值是对象的话，config中可以使用点的方式定位对象中属性的值
  //   console.log(grunt.config('foo.bar'));
  // })

  // --------------------------------------

  // grunt.registerTask('foo', 'a simple task', () => {
  //   console.log('hello grunt');
  // });
  // grunt.registerTask('bar', () => {
  //   console.log('other task...')
  // });
  // // // default是默认任务名称，通过grunt执行时可以省略
  // // grunt.registerTask('default', () => {
  // //   console.log('i am the default task....');
  // // });

  // // 第二个参数指定此任务的映射任务，这样执行default就相当于执行对应的任务
  // // 这里映射的任务会按照顺序执行，不会 同步执行
  // grunt.registerTask('abcd', ['foo', 'bar'])

  // // 也可以在任务函数中执行其他任务
  // grunt.registerTask('run-other', () => {
  //   grunt.task.run('foo', 'bar');
  //   console.log('current task running....');
  // });

  // // 默认grunt采用同步模式编码，如果需要异步，可以使用this.asnyc()方法创建回调函数
  // grunt.registerTask('async-task', () => {
  //   setTimeout(() => {
  //     console.log('异步任务。。。');
  //   }, 1000);
  // });
  
  // // 由于函数体中需要使用this，所以这里不能使用箭头函数
  // grunt.registerTask('real-async', function () {
  //   const done = this.async();
  //   setTimeout(() => {
  //     console.log('async task来了');
  //     done();
  //   }, 1000);
  // });

  // --------------------------------------

  // // 任务函数实行过程中如果返回false，则意味着此任务执行失败
  // grunt.registerTask('bad', () => {
  //   console.log('bad task');
  //   return false;
  // });

  // grunt.registerTask('foo', () => {
  //   console.log('foo working...');
  // });

  // grunt.registerTask('bar', () => {
  //   console.log('bar working...');
  // });

  // // 如果一个任务列表中的某个任务执行失败，则后续任务默认不会执行
  // // 除非grunt运行时指定--force参数来强制执行
  // grunt.registerTask('default', ['foo', 'bad']);

  // grunt.registerTask('async-false', function () {
  //   const done = this.async();
  //   setTimeout(() => {
  //     console.log('bad async');
  //     done(false);
  //   }, 1000);
  // });

  // --------------------------------------

  // 多目标模式，可以让任务根据配置行成多个子任务
  // grunt.initConfig({
  //   build: {
  //     foo: 100,
  //     bar: '456'
  //   }
  // });
  // grunt.registerMultiTask('build', function() {
  //   console.log(`task: build, target: ${this.target}, data: ${this.data}`);
  // });

  // grunt.initConfig({
  //   build: {
  //     options: {
  //       msg: 'task options...'
  //     },
  //     foo: {
  //       options: {
  //         msg: 'foo target options...'
  //       }
  //     },
  //     bar: '456'
  //   }
  // });
  // grunt.registerMultiTask('build', function () {
  //   console.log(this.options());
  // });

  // --------------------------------------

  // grunt.initConfig({
  //   clean: {
  //     temp: 'temp/**'
  //   }
  // });
  // grunt.loadNpmTasks('grunt-contrib-clean');

  // --------------------------------------

  grunt.initConfig({
    sass: {
      options: {
        sourceMap: true,
        implementation: sass,
      },
      main: {
        files: {
          'dist/css/main.css': 'src/scss/main.scss'
        }
      }
    },
    babel: {
      options: {
        sourceMap: true,
        presets: ['@babel/preset-env']
      },
      main: {
        files: {
          'dist/js/app.js': 'src/js/app.js'
        }
      }
    },
    watch: {
      js: {
        files: ['src/js/*.js'],
        tasks: ['babel']
      },
      css: {
        files: ['src/scss/*.scss'],
        tasks: ['sass']
      }
    }
  });
  // grunt.loadNpmTasks('grunt-sass');
  loadGruntTasks(grunt); // 自动加载所有的grunt插件中的任务
  grunt.registerTask('default', ['sass', 'babel', 'watch']);  
}